#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
小米便签网页版连接诊断工具

本工具用于诊断连接已登录Chrome浏览器实例时可能遇到的问题
特点：
- 检查Chrome浏览器是否已启动调试模式
- 检测ChromeDriver和Chrome浏览器版本兼容性
- 提供详细的排查建议和修复方案
- 帮助用户确认环境配置是否正确
"""

import os
import sys
import subprocess
import socket
import platform
import argparse
import time
import logging
from datetime import datetime

# 配置日志
def setup_logger():
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s',
        handlers=[
            logging.FileHandler('mi_note_diagnostics.log'),
            logging.StreamHandler()
        ]
    )
    return logging.getLogger(__name__)

logger = setup_logger()

class MiNoteConnectionDiagnostics:
    def __init__(self, chrome_driver_path, debug_port=9222):
        """初始化诊断工具"""
        self.chrome_driver_path = chrome_driver_path
        self.debug_port = debug_port
    
    def check_chrome_driver_exists(self):
        """检查ChromeDriver文件是否存在"""
        logger.info(f"检查ChromeDriver文件是否存在: {self.chrome_driver_path}")
        if os.path.exists(self.chrome_driver_path):
            logger.info(f"ChromeDriver文件存在，大小: {os.path.getsize(self.chrome_driver_path)} 字节")
            print(f"✅ ChromeDriver文件存在: {self.chrome_driver_path}")
            print(f"   文件大小: {os.path.getsize(self.chrome_driver_path)} 字节")
            return True
        else:
            logger.error(f"ChromeDriver文件不存在: {self.chrome_driver_path}")
            print(f"❌ ChromeDriver文件不存在: {self.chrome_driver_path}")
            print("   请确认路径是否正确，并确保ChromeDriver已正确下载")
            return False
    
    def check_chrome_driver_version(self):
        """检查ChromeDriver版本"""
        logger.info("检查ChromeDriver版本")
        try:
            # 运行ChromeDriver并获取版本信息
            result = subprocess.run(
                [self.chrome_driver_path, "--version"],
                capture_output=True,
                text=True,
                timeout=5
            )
            
            if result.returncode == 0:
                version_info = result.stdout.strip()
                logger.info(f"ChromeDriver版本信息: {version_info}")
                print(f"✅ ChromeDriver版本: {version_info}")
                return version_info
            else:
                logger.error(f"获取ChromeDriver版本失败: {result.stderr}")
                print(f"❌ 获取ChromeDriver版本失败")
                print(f"   错误信息: {result.stderr}")
                return None
        except Exception as e:
            logger.error(f"运行ChromeDriver时发生错误: {str(e)}")
            print(f"❌ 运行ChromeDriver时发生错误: {str(e)}")
            print("   请确认ChromeDriver是否有权限运行，以及是否与当前操作系统兼容")
            return None
    
    def check_debug_port(self):
        """检查调试端口是否开放"""
        logger.info(f"检查调试端口 {self.debug_port} 是否开放")
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(2)
        result = sock.connect_ex(("127.0.0.1", self.debug_port))
        sock.close()
        
        if result == 0:
            logger.info(f"调试端口 {self.debug_port} 已开放")
            print(f"✅ 调试端口 {self.debug_port} 已开放")
            return True
        else:
            logger.error(f"调试端口 {self.debug_port} 未开放")
            print(f"❌ 调试端口 {self.debug_port} 未开放")
            print("   请确认Chrome浏览器是否已使用 --remote-debugging-port=9222 参数启动")
            print("   启动命令示例: chrome.exe --remote-debugging-port=9222")
            return False
    
    def check_chrome_process(self):
        """检查Chrome进程是否正在运行"""
        logger.info("检查Chrome进程是否正在运行")
        system = platform.system().lower()
        
        try:
            if system == "windows":
                # 在Windows上检查Chrome进程
                result = subprocess.run(
                    ["tasklist", "/fi", "imagename eq chrome.exe"],
                    capture_output=True,
                    text=True
                )
                chrome_processes = result.stdout.lower().count("chrome.exe")
                
                if chrome_processes > 0:
                    logger.info(f"检测到 {chrome_processes} 个Chrome进程正在运行")
                    print(f"✅ 检测到 {chrome_processes} 个Chrome进程正在运行")
                    
                    # 检查是否有以调试模式运行的Chrome进程
                    result = subprocess.run(
                        ["wmic", "process", "where", "name='chrome.exe'", "get", "commandline"],
                        capture_output=True,
                        text=True
                    )
                    
                    debug_processes = []
                    for line in result.stdout.splitlines():
                        if "--remote-debugging-port" in line:
                            debug_processes.append(line.strip())
                    
                    if debug_processes:
                        logger.info(f"检测到 {len(debug_processes)} 个以调试模式运行的Chrome进程")
                        print(f"✅ 检测到 {len(debug_processes)} 个以调试模式运行的Chrome进程")
                        for i, process in enumerate(debug_processes, 1):
                            print(f"   进程 {i}: {process}")
                    else:
                        logger.warning("未检测到以调试模式运行的Chrome进程")
                        print("⚠️ 未检测到以调试模式运行的Chrome进程")
                        print("   请使用以下命令启动Chrome: chrome.exe --remote-debugging-port=9222")
                    
                    return True
                else:
                    logger.error("未检测到Chrome进程")
                    print("❌ 未检测到Chrome进程")
                    print("   请确保Chrome浏览器已启动")
                    return False
            else:
                # 非Windows系统的检查方式（简化版）
                result = subprocess.run(
                    ["pgrep", "chrome"],
                    capture_output=True,
                    text=True
                )
                if result.returncode == 0:
                    logger.info("检测到Chrome进程正在运行")
                    print("✅ 检测到Chrome进程正在运行")
                    return True
                else:
                    logger.error("未检测到Chrome进程")
                    print("❌ 未检测到Chrome进程")
                    return False
        except Exception as e:
            logger.error(f"检查Chrome进程时发生错误: {str(e)}")
            print(f"❌ 检查Chrome进程时发生错误: {str(e)}")
            return False
    
    def check_chrome_version(self):
        """检查Chrome浏览器版本"""
        logger.info("检查Chrome浏览器版本")
        system = platform.system().lower()
        
        try:
            if system == "windows":
                # 在Windows上获取Chrome版本
                # 尝试从注册表获取Chrome路径
                try:
                    import winreg
                    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, \
                                        r"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe")
                    chrome_path = winreg.QueryValue(key, None)
                    winreg.CloseKey(key)
                except:
                    # 默认路径
                    chrome_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
                
                result = subprocess.run(
                    [chrome_path, "--version"],
                    capture_output=True,
                    text=True,
                    timeout=5
                )
            else:
                # 非Windows系统
                result = subprocess.run(
                    ["google-chrome", "--version"],
                    capture_output=True,
                    text=True,
                    timeout=5
                )
                
                # 如果上面的命令失败，尝试另一个常见路径
                if result.returncode != 0:
                    result = subprocess.run(
                        ["chrome", "--version"],
                        capture_output=True,
                        text=True,
                        timeout=5
                    )
            
            if result.returncode == 0:
                version_info = result.stdout.strip()
                logger.info(f"Chrome浏览器版本信息: {version_info}")
                print(f"✅ Chrome浏览器版本: {version_info}")
                return version_info
            else:
                logger.error(f"获取Chrome浏览器版本失败: {result.stderr}")
                print(f"❌ 获取Chrome浏览器版本失败")
                print("   请手动检查Chrome浏览器版本")
                return None
        except Exception as e:
            logger.error(f"检查Chrome浏览器版本时发生错误: {str(e)}")
            print(f"❌ 检查Chrome浏览器版本时发生错误: {str(e)}")
            print("   请手动确认Chrome浏览器是否已正确安装")
            return None
    
    def run_full_diagnostics(self):
        """运行完整的诊断流程"""
        print("\n===== 小米便签网页版连接诊断工具 =====")
        print(f"诊断时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print(f"操作系统: {platform.system()} {platform.release()}")
        print(f"Python版本: {platform.python_version()}")
        print("====================================")
        
        # 检查ChromeDriver文件
        driver_exists = self.check_chrome_driver_exists()
        if not driver_exists:
            print("\n❌ 诊断失败: ChromeDriver文件不存在")
            print("请先下载ChromeDriver并确保路径正确")
            return False
        
        # 检查ChromeDriver版本
        driver_version = self.check_chrome_driver_version()
        
        # 检查Chrome进程
        chrome_running = self.check_chrome_process()
        
        # 检查Chrome浏览器版本
        chrome_version = self.check_chrome_version()
        
        # 检查调试端口
        port_open = self.check_debug_port()
        
        # 分析版本兼容性
        if driver_version and chrome_version:
            self._analyze_version_compatibility(driver_version, chrome_version)
        
        # 提供总结和建议
        self._provide_summary_and_recommendations(
            driver_exists, driver_version, chrome_running, chrome_version, port_open
        )
        
        return True
    
    def _analyze_version_compatibility(self, driver_version, chrome_version):
        """分析ChromeDriver和Chrome浏览器版本兼容性"""
        logger.info("分析ChromeDriver和Chrome浏览器版本兼容性")
        
        # 提取主要版本号
        try:
            # 从ChromeDriver版本字符串提取版本号
            # 示例: ChromeDriver 128.0.6613.84 (abc123...)
            driver_version_num = driver_version.split()[1].split(".")[0]
            
            # 从Chrome版本字符串提取版本号
            # 示例: Google Chrome 128.0.6613.84
            chrome_version_num = chrome_version.split()[2].split(".")[0]
            
            logger.info(f"ChromeDriver主版本: {driver_version_num}, Chrome主版本: {chrome_version_num}")
            
            if driver_version_num == chrome_version_num:
                print("✅ 版本兼容性: ChromeDriver和Chrome浏览器主版本匹配")
            else:
                print(f"⚠️ 版本兼容性警告: ChromeDriver主版本({driver_version_num})与Chrome浏览器主版本({chrome_version_num})不匹配")
                print("   这可能导致连接失败，请下载与Chrome浏览器版本匹配的ChromeDriver")
                print("   ChromeDriver下载地址: https://chromedriver.chromium.org/downloads")
        except Exception as e:
            logger.error(f"分析版本兼容性时发生错误: {str(e)}")
            print("⚠️ 无法自动分析版本兼容性，请手动确认ChromeDriver版本是否与Chrome浏览器版本匹配")
    
    def _provide_summary_and_recommendations(self, driver_exists, driver_version, 
                                            chrome_running, chrome_version, port_open):
        """提供诊断总结和建议"""
        print("\n===== 诊断总结与建议 =====")
        
        if not driver_exists:
            print("❌ 关键问题: ChromeDriver文件不存在")
            print("建议: 下载与您Chrome浏览器版本匹配的ChromeDriver")
            print("      下载地址: https://chromedriver.chromium.org/downloads")
        elif not chrome_running:
            print("❌ 关键问题: Chrome浏览器未运行")
            print("建议: 启动Chrome浏览器，并使用调试模式参数")
            print("      启动命令: chrome.exe --remote-debugging-port=9222")
        elif not port_open:
            print("❌ 关键问题: 调试端口9222未开放")
            print("建议: 关闭所有Chrome实例，然后使用以下命令重新启动:")
            print("      chrome.exe --remote-debugging-port=9222")
            print("      确保没有其他程序占用了9222端口")
        else:
            print("✅ 基本连接环境正常")
            print("建议: 现在尝试运行导出工具，确保:")
            print("      1. 在调试模式启动的Chrome浏览器中已登录小米云服务")
            print("      2. 已导航到便签页面(https://i.mi.com/note)")
            print("      3. 页面上能看到您的便签列表")
        
        print("\n===== 完整导出步骤 =====")
        print("1. 关闭所有Chrome浏览器实例")
        print("2. 以管理员身份打开命令提示符")
        print("3. 执行命令: chrome.exe --remote-debugging-port=9222")
        print("4. 在打开的浏览器中登录小米云服务并导航到便签页面")
        print("5. 运行导出工具: python mi_note_web_exporter_existing_browser.py --driver_path 'C:\\Program Files\\chrome\\chromedriver.exe'")
        
        print("\n如果问题仍然存在，请参考日志文件: mi_note_diagnostics.log")

def parse_args():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description='小米便签网页版连接诊断工具')
    parser.add_argument('--driver_path', required=True, help='ChromeDriver的路径')
    parser.add_argument('--debug_port', type=int, default=9222, help='Chrome调试端口')
    return parser.parse_args()

def main():
    # 解析命令行参数
    args = parse_args()
    
    # 创建诊断工具实例
    diagnostics = MiNoteConnectionDiagnostics(
        chrome_driver_path=args.driver_path,
        debug_port=args.debug_port
    )
    
    # 运行完整诊断
    diagnostics.run_full_diagnostics()

if __name__ == "__main__":
    main()